//数组
#include <stdio.h>
//变长数组
int main()
{
    int n;
    scanf("%d",&n); 
    int arr[n]; //不能初始化
    int i;
    //输入
    for(i=0;i<n;i++)
    {
        scanf("%d",&arr[i]);
    }
    //输出
    for(i=0;i<n;i++)
    {
        printf("%d ",arr[i]);
    }
    return 0;
}

//二维数组
int main()
{
    int arr[3][4]={1,2,3,4,2,3,4,5,5,6,7,8};
    //输入二维数组
    int i,j;//行和列
    for(i=0;i<3;i++)
    {
        for(j=0;j<4;j++)
        {
            scanf("%d",&arr[i][j]); //这里%d后面不要有 ,输入时打 。(空格的意思)
        }
    }
    //访问二维数组
    printf("%d\n",arr[0][2]);
    for(i=0;i<3;i++)
    {
        for(j=0;j<4;j++)
        {
            printf("%d ",arr[i][j]);
        }
        printf("\n");
    }
    return 0;
}


//二维数组越界
//列越界
int main()
{
   char ch[3][2]={'a','b','c','d','e','f'};
   int i,j;
   for(i=0;i<3;i++)
   {
    for(j=0;j<3;j++) //这里正确的是j<2
    {
        printf("%c ",ch[i][j]); //输出:a b c c d e e f 
        //printf("&ch[%d][%d]=%p\n",i,j,&ch[i][j]);
    }
   }
}
//输出：
//&ch[0][0]=000000000061FE32
//&ch[0][1]=000000000061FE33
//&ch[0][2]=000000000061FE34
//&ch[1][0]=000000000061FE34
//&ch[1][1]=000000000061FE35
//&ch[1][2]=000000000061FE36
//&ch[2][0]=000000000061FE36
//&ch[2][1]=000000000061FE37
//&ch[2][2]=000000000061FE38
//行越界
int main()
{
   char ch[3][2]={'a','b','c','d','e','f'};
   int i,j;
   for(i=0;i<4;i++) //这里正确的是i<3
   {
    for(j=0;j<2;j++)
    {
        //printf("%c ",ch[i][j]);
        printf("&ch[%d][%d]=%p\n",i,j,&ch[i][j]);
    }
   }
}
//输出：
//&ch[0][0]=000000000061FE32
//&ch[0][1]=000000000061FE33
//&ch[1][0]=000000000061FE34
//&ch[1][1]=000000000061FE35
//&ch[2][0]=000000000061FE36
//&ch[2][1]=000000000061FE37
//&ch[3][0]=000000000061FE38  范围外越界
//&ch[3][1]=000000000061FE39  范围外越界


//冒泡排序
//核心思想：相邻两个元素进行比较交换,最终形成一个升序数组
void bubble_sort(int arr[],int sz)
{
    int i,j;
    //10个元素共9趟排序
    for(i=0;i<sz-1;i++)
    {
        //每一趟中两两个数比较
        for(j=0;j<sz-1-i;j++)
        {
            if(arr[j]>arr[j+1])   //当arr[j]<arr[j+1]时，未交换
            {                     //那么回到循环条件j++,再进入判断时
                int tmp=arr[j];   //新的arr[j]是之前那个arr[j]的下一个数，即之前的arr[j+1]
                arr[j]=arr[j+1];  //eg:int arr[]={2,1,4,3,5};
                arr[j+1]=tmp;     //j=0 ——> arr[0]=2 > arr[1]=1  交换: arr[0]=1 arr[1]=2
            }                     //{1,2,4,3,5} 回到循环条件j++
        }                         //j=1 ——> arr[1]=2 < arr[2]=4  未交换
    }                             //{1,2,4,3,5} 回到循环条件j++
}                                 //j=2 ——> arr[2]=4 > arr[3]=3  交换: arr[2]=3 arr[3]=4
int main()                        //{1,2,3,4,5}  ……
{
    //一个乱序或降序的数组
    int arr[]={9,8,7,6,5,4,3,2,1,0};
    int sz=sizeof(arr)/sizeof(arr[0]);  //P53
    bubble_sort(arr,sz);
    //打印
    int i=0;
    for(i=0;i<sz;i++)
    {
        printf("%d ",arr[i]); //输出:0 1 2 3 4 5 6 7 8 9
    }
    return 0;
}

//三子棋 见vs2022

//交换数组
void exchange(int arr1[],int arr2[],int sz)
{
    int i;
    for(i=0;i<sz;i++)
    {
        int m=arr1[i];
        arr1[i]=arr2[i];
        arr2[i]=m;
    }
}
int main()
{
    int arr1[5]={1,2,3,4,5};
    int arr2[5]={6,7,8,9,0};
    int sz=sizeof(arr1)/sizeof(arr1[0]);
    exchange(arr1,arr2,sz);
    int i,j;
    for(i=0;i<sz;i++)
    {
        printf("%d ",arr1[i]);
    }
    printf("\n");
    for(j=0;j<sz;j++)
    {
        printf("%d ",arr2[j]);
    }
    return 0;
}

//创建一个整型数组，完成对数组的操作
//实现函数init()，初始化数组全为0
//实现print()，打印数组的每个元素
//实现reverse()，函数完成数组元素的逆置
void init(int arr[],int sz)
{
    int i;
    for(i=0;i<sz;i++)
    {
        arr[i]=0;
    }
}
void print(int arr[],int sz)
{
    int i;
    for(i=0;i<sz;i++)
    {
        printf("%d ",arr[i]);
    }
}
void reverse(int arr[],int sz)
{
    int left=0;
    int right=sz-1;
    while(left<right)
    {
        int tmp=arr[left];
        arr[left]=arr[right];
        arr[right]=tmp;
        left++;
        right--;
    }
}
int main()
{
    int arr[5]={1,2,3,4,5};
    int sz=sizeof(arr)/sizeof(arr[0]);
    reverse(arr,sz);
    print(arr,sz);
    printf("\n");
    init(arr,sz);
    print(arr,sz);
    return 0;
}

//扫雷 见vs2022